package zxc.com;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * 功能：在HDFS上创建文件
 */
public class CreateFileOnHDFS {
    //创建文件
    @Test
    public void create1() throws Exception {
        // 创建配置对象
        Configuration conf = new Configuration();
        // 定义统一资源标识符（uri: uniform resource identifier）
        String uri = "hdfs://node1:8020";
        // 创建文件系统对象（基于HDFS的文件系统）
        FileSystem fs = FileSystem.get(new URI(uri), conf,"root");
        // 创建路径对象（指向文件）
        Path path = new Path(uri + "/hadoop1.txt");
        // 基于路径对象创建文件
        boolean result = fs.createNewFile(path);
        // 根据返回值判断文件是否创建成功
        if (result) {
            System.out.println("文件[" + path + "]创建成功！");
        } else {
            System.out.println("文件[" + path + "]创建失败！");
        }
    }
    // 文件下载
    @Test
    public void down() throws URISyntaxException, IOException, InterruptedException {
        Configuration c  = new Configuration();
        String uri = "hdfs://node1:8020";
        // 创建文件系统对象（基于HDFS的文件系统）
        FileSystem fs = FileSystem.get(new URI(uri), c,"root");

        fs.copyToLocalFile(false,new Path("/input1.txt"),new Path("D:/input.txt"));

        fs.close();
    }
    //删除文件夹
    @Test
    public void rmDir() throws URISyntaxException, IOException, InterruptedException {
        Configuration c  = new Configuration();
        String uri = "hdfs://node1:8020";
        // 创建文件系统对象（基于HDFS的文件系统）
        FileSystem fs = FileSystem.get(new URI(uri), c,"root");

        fs.delete(new Path("/input1.txt"),true);

        fs.close();
    }
    // 重命名
    @Test
    public void reName() throws URISyntaxException, IOException, InterruptedException {
        Configuration c  = new Configuration();
        String uri = "hdfs://node1:8020";
        // 创建文件系统对象（基于HDFS的文件系统）
        FileSystem fs = FileSystem.get(new URI(uri), c,"root");

        fs.rename(new Path("/hadoop.txt"),new Path("/dada.txt"));

        fs.close();
    }
    // 文件详情
    @Test
    public void list() throws URISyntaxException, IOException, InterruptedException {
        Configuration c  = new Configuration();
        String uri = "hdfs://node1:8020";
        // 创建文件系统对象（基于HDFS的文件系统）
        FileSystem fs = FileSystem.get(new URI(uri), c,"root");

        RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fs.listFiles(new Path("/"), true);
        while (locatedFileStatusRemoteIterator.hasNext()){
            final LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
            // 查下看size 权限，长度，快信息
            System.out.println(next.getPath().getName());
            System.out.println(next.getPermission());
            final BlockLocation[] blockLocations = next.getBlockLocations();
            for (BlockLocation b : blockLocations){
                String[] hosts = b.getHosts();
                for(String s : hosts){
                    System.out.println(s);
                }
            }

        }
        fs.close();
    }
    // 判断是否文件夹
    @Test
    public void check() throws URISyntaxException, IOException, InterruptedException {
        Configuration c  = new Configuration();
        String uri = "hdfs://node1:8020";
        // 创建文件系统对象（基于HDFS的文件系统）
        FileSystem fs = FileSystem.get(new URI(uri), c,"root");

        RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fs.listFiles(new Path("/"), true);
        while (locatedFileStatusRemoteIterator.hasNext()) {
            LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
            String name  = next.getPath().getName();

            if(next.isFile()){
                System.out.println(name + " is file");
            }else {
                System.out.println(name + " is dic");
            }

        }
        fs.close();
    }
}
